/**
 * 订单模型
 * 用于定义订单表的结构以及相关操作
 * 
 * 数据库表定义（对应 flower_db_ddl_init.sql 中的 orders 表）：
 * - id: INT UNSIGNED AUTO_INCREMENT COMMENT '主键'
 * - order_no: VARCHAR(32) NOT NULL COMMENT '订单号（唯一）'
 * - user_id: INT UNSIGNED NOT NULL COMMENT '用户id' (外键 → users.id)
 * - total_amount: DECIMAL(10,2) NOT NULL COMMENT '订单总金额'
 * - status: TINYINT NOT NULL DEFAULT 1 COMMENT '状态：1待付款 2已付款 3配送中 4已配送 5退货中 6已退款'
 * - receiver_name: VARCHAR(50) NOT NULL COMMENT '收货人称呼'
 * - receiver_phone: VARCHAR(20) NOT NULL COMMENT '收货人电话'
 * - province: VARCHAR(20) NOT NULL COMMENT '省'
 * - city: VARCHAR(20) NOT NULL COMMENT '市'
 * - district: VARCHAR(20) NOT NULL COMMENT '区/县'
 * - detail_address: VARCHAR(255) NOT NULL COMMENT '详细地址'
 * - order_type: TINYINT NOT NULL DEFAULT 1 COMMENT '订单类型：1商品订单 2礼品卡订单'
 * - expected_delivery_date: DATETIME COMMENT '期望送达日期'
 * - order_date: DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '下单日期'
 * - remark: VARCHAR(255) COMMENT '备注'
 * - created_at: DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)
 * - updated_at: DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)
 * 
 * 索引定义：
 * - PRIMARY KEY (id)
 * - UNIQUE KEY uk_orders_order_no (order_no)
 * - KEY idx_orders_user_id (user_id)
 * - KEY idx_orders_status (status)
 * - KEY idx_orders_order_date (order_date)
 * 
 * 外键约束：
 * - CONSTRAINT fk_orders_users_user_id FOREIGN KEY (user_id) REFERENCES users(id)
 */
const { DataTypes } = require('sequelize');
const { sequelize } = require('../config/database');

const Order = sequelize.define('Order', {
  // 主键ID，自动递增
  id: {
    type: DataTypes.INTEGER.UNSIGNED,
    primaryKey: true,
    autoIncrement: true,
    field: 'id',
    comment: '主键'
  },
  // 订单号，唯一，不能为空
  orderNo: {
    type: DataTypes.STRING(32),
    allowNull: false,
    unique: true,
    field: 'order_no',
    comment: '订单号（唯一）'
  },
  // 用户ID，不能为空
  userId: {
    type: DataTypes.INTEGER.UNSIGNED,
    allowNull: false,
    field: 'user_id',
    comment: '用户id'
  },
  // 订单总金额，不能为空
  totalAmount: {
    type: DataTypes.DECIMAL(10, 2),
    allowNull: false,
    field: 'total_amount',
    comment: '订单总金额'
  },
  // 订单状态：1待付款 2已付款 3配送中 4已配送 5退货中 6已退款，默认为1（待付款）
  status: {
    type: DataTypes.TINYINT,
    allowNull: false,
    defaultValue: 1,
    field: 'status',
    comment: '状态：1待付款 2已付款 3配送中 4已配送 5退货中 6已退款'
  },
  // 收货人姓名，不能为空
  receiverName: {
    type: DataTypes.STRING(50),
    allowNull: false,
    field: 'receiver_name',
    comment: '收货人称呼'
  },
  // 收货人电话，不能为空
  receiverPhone: {
    type: DataTypes.STRING(20),
    allowNull: false,
    field: 'receiver_phone',
    comment: '收货人电话'
  },
  // 省，不能为空
  province: {
    type: DataTypes.STRING(20),
    allowNull: false,
    field: 'province',
    comment: '省'
  },
  // 市，不能为空
  city: {
    type: DataTypes.STRING(20),
    allowNull: false,
    field: 'city',
    comment: '市'
  },
  // 区/县，不能为空
  district: {
    type: DataTypes.STRING(20),
    allowNull: false,
    field: 'district',
    comment: '区/县'
  },
  // 详细地址，不能为空
  detailAddress: {
    type: DataTypes.STRING(255),
    allowNull: false,
    field: 'detail_address',
    comment: '详细地址'
  },
  // 订单类型：1商品订单 2礼品卡订单，默认为1（商品订单）
  orderType: {
    type: DataTypes.TINYINT,
    allowNull: false,
    defaultValue: 1,
    field: 'order_type',
    comment: '订单类型：1商品订单 2礼品卡订单'
  },
  // 期望送达日期，可为空
  expectedDeliveryDate: {
    type: DataTypes.DATE,
    allowNull: true,
    field: 'expected_delivery_date',
    comment: '期望送达日期'
  },
  // 下单日期，默认为当前时间
  orderDate: {
    type: DataTypes.DATE,
    allowNull: false,
    defaultValue: DataTypes.NOW,
    field: 'order_date',
    comment: '下单日期'
  },
  // 备注，可为空
  remark: {
    type: DataTypes.STRING(255),
    allowNull: true,
    field: 'remark',
    comment: '备注'
  }
}, {
  // 指定数据库中的表名
  tableName: 'orders',
  // 启用时间戳功能，自动管理创建时间和更新时间
  timestamps: true,
  // 自定义创建时间字段名，对应数据库中的 created_at 字段
  createdAt: 'created_at',
  // 自定义更新时间字段名，对应数据库中的 updated_at 字段
  updatedAt: 'updated_at',
  // 定义表的索引（与数据库DDL完全一致）
  indexes: [
    // 为订单号建立唯一索引
    { name: 'uk_orders_order_no', fields: ['orderNo'], unique: true },
    // 为用户ID建立普通索引
    { name: 'idx_orders_user_id', fields: ['userId'] },
    // 为订单状态建立普通索引
    { name: 'idx_orders_status', fields: ['status'] },
    // 为下单日期建立普通索引
    { name: 'idx_orders_order_date', fields: ['orderDate'] }
  ]
});

// 添加实例方法以确保字段正确序列化
Order.prototype.toJSON = function() {
  const values = Object.assign({}, this.get());
  // 移除时间字段
  delete values.created_at;
  delete values.updated_at;
  return values;
};

module.exports = Order;